#!/bin/sh

#source var/function
. ./function.sh
inst_launch_workaround

PATH=./:$PATH
LOG_DIR="./log"

print_start() {
	#    more << EOF
	echo "Athena Starting..."
	echo "            (c) 2013 rAthena Project"
	echo ""
	echo ""
	echo "checking..."
	#EOF
}

get_status(){
	PIDFILE=.$1.pid
	if [ -e ${PIDFILE} ]; then
		ISRUN=$(ps ax | grep $(cat ${PIDFILE}) | grep $1)
		PSRUN=$(echo "$ISRUN" | awk '{ print substr( $0, 0, 7) }')
	fi
	#return ${PSRUN} #seem to cause issue for some os
}

#cheking if already started, launch and mark in log
start_serv(){ 
	get_status $1
	if [ $2 ]; then #is logging on ?
		LOGFILE="$LOG_DIR/$1.launch.log"
		LOGRUN="$LOG_DIR/$1.log"
		FIFO="$1_fifo"
		echo "stat_serv, log is enabled"
		echo "My logfile=${LOGFILE}"
		if [ -z ${PSRUN} ]; then
		if [ -e ./${FIFO} ]; then rm "$FIFO"; fi
			mkfifo "$FIFO"; tee "$LOGRUN" < "$FIFO" & "./$1" > "$FIFO" 2>&1 & PID=$!
			#"./$1" > >(tee "$LOGRUN") 2>&1 & PID=$! #bash only
			echo "$PID" > .$1.pid
			echo "Server '$1' started at `date +"%m-%d-%H:%M-%S"`" | tee ${LOGFILE}
		else
			echo "Can't start '$1', cause is already running p${PSRUN}" | tee ${LOGFILE}
		fi
	else
		if [ -z ${PSRUN} ]; then
			./$1&
			echo "$!" > .$1.pid
			echo "Server '$1' started at `date +"%m-%d-%H:%M-%S"`"
		else
			echo "Can't start '$1', cause is already running p${PSRUN}"
		fi
	fi
}

watch_serv(){
	ulimit -Sc unlimited

	#now checking status and looping
	count=0;
	while true; do
		for i in ${L_SRV} ${C_SRV} ${M_SRV}
		do
			LOGFILE="$LOG_DIR/$i.launch.log"
			LOGRUN="$LOG_DIR/$i.log"
			FIFO=$i"_fifo"
	
			get_status $i
			#echo "Echo id of $i is ${PSRUN}"
			if [ -z ${PSRUN} ]; then
				count=$((count+1))
				#echo "fifo=$FIFO"
				echo "server '$i' is down"
				echo "server '$i' is down" >> ${LOGFILE}
				echo "restarting server at time at `date +"%m-%d-%H:%M-%S"`" 
				echo "restarting server at time at `date +"%m-%d-%H:%M-%S"`" >> ${LOGFILE}
				if [ -e $FIFO ]; then rm $FIFO; fi
				mkfifo "$FIFO"; tee "$LOGRUN" < "$FIFO" & "./$i" > "$FIFO" 2>&1 & PID=$!
				echo "$PID" > .$i.pid
				if [ $2 ] && [ $2 -lt $count ]; then break; fi   
			fi
		done
		sleep $1
	done
}

restart(){
	$0 stop
	if [ $1 ]; then sleep $1; fi
	for i in ${L_SRV} ${C_SRV} ${M_SRV}
	do
		FIFO="$1_fifo"
		while true; do
			get_status ${i}
			if [ ${PSRUN} ]; then echo "'${i}' is still running p${PSRUN} waiting end"; sleep 2;
			else 
				if [ -e ./${FIFO} ]; then rm "$FIFO"; fi
				break
			fi
		done
	done
  $0 start
}

case $1 in
    'start')
		print_start
		check_files
		echo "Check complete."
		echo "Looks good, a nice Athena!"
		if [ "$2" = "--enlog" ]; then
		 ENLOG=1
		 if [ ! -d "$LOG_DIR" ]; then mkdir -p $LOG_DIR; fi
		 echo "Logging is enable in $LOG_DIR"
		else
		 echo "Logging is disable"
		fi
		for i in ${L_SRV} ${C_SRV} ${M_SRV}
		do
			start_serv $i $ENLOG
		done
		echo "Now Started Athena."
	;;
    'watch')
		if [ ! -d "$LOG_DIR" ]; then mkdir -p $LOG_DIR; fi
		if [ -z $2 ]; then Restart_count=10; else Restart_count=$2; fi
		if [ -z $3 ]; then Restart_sleep=3; else Restart_sleep=$3; fi
		echo " Gonna watch rA for Restart_count = $Restart_count, Restart_sleep= $Restart_sleep"
		for i in ${L_SRV} ${C_SRV} ${M_SRV}
		do
			start_serv $i 1
		done
		watch_serv $Restart_count $Restart_sleep
		echo "Now watching Athena."
	;;	
	'stop')
		for i in ${L_SRV} ${C_SRV} ${M_SRV}
		do
			PIDFILE=.${i}.pid
			if [ -e ./${PIDFILE} ]; then
				kill $(cat ${PIDFILE})
				rm ${PIDFILE}
			fi
		done
	;;
	'restart')
		 restart
	;;
	'status')
	for i in ${L_SRV} ${C_SRV} ${M_SRV}
	do
		get_status ${i}
		if [ ${PSRUN} ]; then echo "'${i}' is running p${PSRUN}"; else echo "'${i}' seem down"; fi
	done
	;;
	'help')
		case $2 in
			'start')
				echo "syntaxe: 'start {--enlog}'"
				echo "This option will starts the servs"
				echo "--enlog will tee all terminal output into a log/$servname.log file"
			;;
			'stop')
				echo "This option will shutdowns the servs'"
			;;
			'restart')
				echo "syntaxe: 'restart {<delay>}'"
				echo "This option will wait delay then will attempt to restart the servs"
				echo "NB, even if delay is over it will wait the pid is finished before atetmpting to restart servs"
			;;
			'status')
				echo "This option let you know if the server are running or not"
				echo "NB this option is based on PID and supposed you have launch the serv by this script"
				echo " If it wasn't the case please use something like 'ps ax | grep server' to know their status"
			;;
			'watch')
				echo "syntaxe: 'watch {<restart_intervall> <restart_count>}'"
				echo "The watch option allow you to auto restart the server when this one was stopped"
				echo "<restart_intervall> delay in second before recheking if server are down (default 10) "
				echo "<restart_count> how many time should we restart servs (default 3), (-1=undefinitly)"
			;;
			*)
				echo "Please specify a command you'll like more info  { start | stop | restart | status | watch }"
				read -p "Enter a valid command: " readEnterKey
				$0 "help" $readEnterKey
			;;
		esac
	;;
	*)
		echo "Usage: athena-start { start | stop | restart | status | watch | help }"
		read -p "Enter a valid option: " readEnterKey
		$0 $readEnterKey
	;;
esac


